package com.example.demo;

// 导入java.util包下的Scanner类，用于从控制台读取用户输入的数据
import java.util.Scanner;

// 定义Student类，封装学生的核心信息，体现面向对象的"封装"特性（第七章核心知识点）
class Student {
    // 定义私有成员变量：学生学号，private修饰确保仅本类可直接访问，保障数据安全
    private String id;
    // 定义私有成员变量：学生姓名，遵循封装原则，不对外暴露
    private String name;
    // 定义私有成员变量：学生年龄，通过私有修饰实现数据隐藏
    private int age;

    // 定义Student类的带参构造方法，用于创建学生对象时初始化所有私有属性
    // 参数依次为：学号(id)、姓名(name)、年龄(age)
    public Student(String id, String name, int age) {
        this.id = id; // 将构造方法接收的学号参数赋值给当前对象的id属性
        this.name = name; // 将构造方法接收的姓名参数赋值给当前对象的name属性
        this.age = age; // 将构造方法接收的年龄参数赋值给当前对象的age属性
    }

    // 定义id属性的getter方法，对外提供安全的学号访问入口（封装的核心实现：私有属性通过公共方法访问）
    public String getId() {
        return id; // 返回当前对象的id属性值
    }

    // 重写Object类的toString方法，用于格式化输出学生信息（方便后续打印学生对象）
    @Override
    public String toString() {
        // 拼接学号、姓名、年龄为字符串并返回，格式清晰易读
        return "学号：" + id + "，姓名：" + name + "，年龄：" + age;
    }
}

// 定义系统主类StudentManager，包含main方法，是程序的入口
public class StudentManager {
    // 定义静态成员变量：Student类型数组students，用于存储学生对象
    // static修饰表示该数组属于类，而非单个对象，所有对象共享，最多存储5个学生
    private static Student[] students = new Student[5];
    // 定义静态成员变量count，用于记录已添加到数组中的学生数量
    // static修饰确保计数在类层面共享，不受对象创建影响
    private static int count = 0;

    // 定义main方法，程序的入口点，所有代码从这里开始执行
    public static void main(String[] args) {
        // 创建Scanner对象sc，用于读取用户在控制台输入的内容
        Scanner sc = new Scanner(System.in);
        // 定义布尔类型变量running，作为主菜单循环的控制条件，true表示系统运行，false表示退出
        boolean running = true;

        // 主菜单循环：只要running为true，就持续显示菜单并接收用户操作
        while (running) {
            // 打印系统标题，换行符(\n)确保标题与上一次操作结果分隔，提升可读性
            System.out.println("\n===== 简易学生信息管理系统 =====");
            // 打印系统功能选项，供用户选择操作
            System.out.println("1. 添加学生  2. 查看所有学生  3. 退出");
            // 提示用户输入操作编号，print不自动换行，让用户输入内容跟在提示后
            System.out.print("请选择操作（1-3）：");
            // 调用Scanner的nextInt()方法，读取用户输入的整数（操作编号）
            int choice = sc.nextInt();
            // 调用Scanner的nextLine()方法，吸收输入缓冲区中残留的换行符
            // 避免后续调用nextLine()读取字符串时，误读为空值
            sc.nextLine();

            //  switch分支结构：根据用户输入的choice值，执行对应功能
            switch (choice) {
                // 当用户选择1时，执行添加学生功能
                case 1:
                    addStudent(sc); // 调用静态方法addStudent，并传入Scanner对象sc
                    break; // 跳出switch分支，避免执行后续case
                // 当用户选择2时，执行查看所有学生功能
                case 2:
                    showAllStudents(); // 调用静态方法showAllStudents，查看学生列表
                    break; // 跳出switch分支
                // 当用户选择3时，执行退出系统功能
                case 3:
                    System.out.println("系统已退出！"); // 打印退出提示信息
                    running = false; // 将running设为false，结束主菜单循环
                    break; // 跳出switch分支
                // 当用户输入的数字不是1-3时，执行默认分支（无效输入处理）
                default:
                    System.out.println("输入错误，请选1-3！"); // 打印错误提示，引导用户正确输入
            }
        }
        sc.close(); // 关闭Scanner对象，释放输入资源，避免资源泄漏
    }

    // 定义静态方法addStudent，用于实现添加学生功能，参数sc用于读取用户输入
    private static void addStudent(Scanner sc) {
        // 判断已添加的学生数量count是否大于等于数组长度（5），即数组是否已满
        if (count >= students.length) {
            System.out.println("学生数量已达上限（5人），无法添加！"); // 打印数组满的提示
            return; // 退出当前方法，不再执行后续添加逻辑
        }

        // 提示用户输入学生学号
        System.out.print("请输入学生学号：");
        String id = sc.nextLine(); // 调用Scanner的nextLine()方法，读取用户输入的学号（字符串类型）

        // 提示用户输入学生姓名
        System.out.print("请输入学生姓名：");
        String name = sc.nextLine(); // 读取用户输入的姓名（字符串类型）

        // 提示用户输入学生年龄
        System.out.print("请输入学生年龄：");
        int age = sc.nextInt(); // 读取用户输入的年龄（整数类型）
        sc.nextLine(); // 吸收年龄输入后的换行符，避免影响后续可能的字符串读取

        // 创建Student对象，将用户输入的id、name、age作为参数传入构造方法
        // 并将创建的对象存入students数组的第count个位置（count从0开始）
        students[count] = new Student(id, name, age);
        count++; // 将已添加学生数量count加1，记录最新数量
        System.out.println("学生添加成功！"); // 打印添加成功的提示信息
    }

    // 定义静态方法showAllStudents，用于查看所有已添加的学生信息
    private static void showAllStudents() {
        // 判断count是否为0，即是否没有添加任何学生
        if (count == 0) {
            System.out.println("暂无学生信息，请先添加！"); // 打印无数据提示
            return; // 退出当前方法，不再执行后续逻辑
        }

        // 打印学生列表标题，换行符提升可读性
        System.out.println("\n===== 学生信息列表 =====");
        // 循环遍历students数组，i从0开始，到count-1结束（仅遍历已添加学生的位置）
        for (int i = 0; i < count; i++) {
            // 打印学生序号（i+1，让序号从1开始）和学生信息
            // students[i]会自动调用Student类重写的toString()方法，格式化输出信息
            System.out.println((i+1) + "、" + students[i]);
        }
    }
}